#include <iostream>
#include <vector>
#include <sstream>
#include <fstream>
#include <cstdlib>

#include <stdio.h>
#include <math.h>
using namespace std;

#include "lib/class.neurona.cpp"


void ejercicio2() {
	// Patron de inicio....
	string entrada = "data/tabla2.csv";
	//Archivo de salida
	string salida = "data/patrones.csv";
	
	//Cantidad de particiones
	unsigned particiones = 10;
	
	//
	
	
	
	
	
}



int main(int argcrandom_float, char *argv[]) {	
	//Pipe para poder Plotear en GNUPLOT
	GNUplot plotter;
	
	// Archivo donde se encuentran los Puntos de entrenamiento: Aqui XOR u OR
	string archivo = "data/OR.csv";
	// Numero de entradas : Cantidad de entradas que tiene el archivo; Por ejemplo x1 x2 Y => Entradas = 2;
	unsigned num_entradas = 2;
	//Tasa de Aprendizaje (Corrector)
	double tasa = 0.05;	
	//Cantidad de Epocas de Entrenamiento
	unsigned epocas = 500;
	//Desvio... Para poder generar el rango de puntos
	double desvio = 0.5;
	//Cantidad de puntos: Cantidad de puntos alrededor del punto original a ser desviados
	unsigned cantidad_puntos = 1200;
	//21312321
	unsigned entrenamiento_porcentaje = 50;
	
	
	//Leemos el contenido del archivo de patrones en un vector
	vector<vector <double> > Lectura = parse_cvs((char *)archivo.c_str()); 
	
	//Generamos los patrones de entrenamiento	
	vector<vector<double> > aleatorios = generar_random_vector(cantidad_puntos, Lectura, desvio);
	
	Lectura = aleatorios;
	
	vector<vector<double> > X = vector<vector<double> >();
	vector<vector<double> > Y = vector<vector<double> >();
	separar_x_y(Lectura, num_entradas, X, Y);
	
	//Ploteamos TODOS los puntos
	plotter("set pointsize 4");
	plotter("set grid back");
	plotter("set xzeroaxis lt -1");
	plotter("set yzeroaxis lt -1");
	plotter("set xrange [-1.6:1.6]");
	plotter("set yrange [-1.6:1.6]");
	plotter("set multiplot");
	plotter("set title \"Grafica TP 1 - Inteligencia Computacional 2011\"");
	string plot1 = "plot \"-\" notitle pt 6 lt 1\n";
	string plot2 = "plot \"-\" notitle pt 8 lt 3\n";
	for (int i = 0 ; i < X.size(); i++) {
		
		if (Y[i][0] == 1) {
			for (int j = 0 ; j < X[i].size(); j++) {
				plot1 += doubletostr(X[i][j]) + " ";
			}
			plot1 += "\n";
		} else {
			for (int j = 0 ; j < X[i].size(); j++) {
				plot2 += doubletostr(X[i][j]) + " ";
			}
			plot2 += "\n";		
		}
	}
	plot1 += "e\n";
	plot2 += "e\n";
	plotter(plot1);
	plotter(plot2);
	
	
	//Creamos un perceptron simple.
	Neurona neurona1(num_entradas, tasa, plotter);
	
	//Dividimos el conjunto de puntos en 2 subconjuntos: uno para entrenamiento y otro para pruebas.
	
	vector< vector<double> > Entrenamiento;
	vector< vector<double> > Pruebas;
	
	
	unsigned puntos_entrenamiento = aleatorios.size();
	puntos_entrenamiento = floor((entrenamiento_porcentaje/100.0)*puntos_entrenamiento);
	
	for (int i = 0 ; i < cantidad_puntos; i++) {
		if (i < puntos_entrenamiento)
			Entrenamiento.push_back(aleatorios[i]);
		else
			Pruebas.push_back(aleatorios[i]);
		
	}
	
	separar_x_y(Entrenamiento, num_entradas, X, Y);	
	neurona1.entrenar_n(X, neurona1.seleccionar_Y(Y, 0), epocas,  true);
	
	cout<<endl<<"\033[01;36m\   ***Fin del primer entrenamiento*** \033[00m\ "<<endl<<endl<<endl;
	separar_x_y(Pruebas, num_entradas, X, Y);
	neurona1.test(X, neurona1.seleccionar_Y(Y,0));
	getchar();
	return 0;
}




